#include <stdio.h>
#include <unistd.h>
char* command1[] = {"cat","/etc/passwd",NULL};
char* command2[] = {"grep","root",NULL};
int main(void)
{
	int fp[2];
	// 备份标准输出
	int stdout_copy = dup(STDOUT_FILENO);
	if(-1 == pipe(fp))
	{
		perror("pipe error");
		return 1;
	}
	int pid = fork();
	if(pid == -1)
	{
		perror("first fork error");
		return 1;
	}
	else if(pid == 0)// 读取内容进程
	{
		// 关闭读端
		close(fp[0]);
		// cat命令默认从标准输出读取数据，使用dup2命令把标准输出转换成管道的输入端
		dup2(fp[1],STDOUT_FILENO);
		close(fp[1]);
		if(execvp(command1[0],command1) == -1)
		{
			// 显示出错信息前先把标准输出还原
			dup2(stdout_copy,STDOUT_FILENO);
			printf("fail to execute %s",command1[0]);
			perror("\n");
			return 1;
		}
	}
	else if(pid > 0)
	{
		pid = fork();
		if(pid == -1)
		{
			perror("second fork error");
			return 1;
		}
		else if(pid == 0)// 过滤内容进程
		{
			// 关闭写端
			close(fp[1]);
			// 和上面进程一样，把标准输入转换成管道出口
			dup2(fp[0],STDIN_FILENO);
			close(fp[0]);
			if(execvp(command2[0],command2) == -1)
			{
				dup2(stdout_copy,STDOUT_FILENO);
				printf("fail to execute %s",command2[0]);
				perror("\n");
				return 1;
			}
		}
		else// 主进程
		{
			// 回收进程资源
			printf("\n");
			wait(NULL);
			// 关闭
			close(fp[0]);
			close(fp[1]);
		}
	}
	return 0;
}
